package org.robotframework.swing.testapp; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.swing.Box; import javax.swing.ComboBoxModel; import javax.swing.DefaultComboBoxModel; import javax.swing.DefaultListCellRenderer; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.ListCellRenderer; import javax.swing.SpinnerListModel; import javax.swing.SpinnerNumberModel; import javax.swing.SwingUtilities; import javax.swing.table.JTableHeader; import javax.swing.table.TableColumnModel; public class TestApplication { private JPanel panel; private JFrame frame; public static void main(String[] args) { new TestApplication().runTestApplication(); } public void runTestApplication() { SwingUtilities.invokeLater(new Runnable() { public void run() { createFrame(); createMainPanel(); addMenuBar(); addComponentsToMainPanel(); addMainPanelToFrame(); showGUI(); } }); } private void showGUI() { frame.pack(); frame.setVisible(true); } private void addMainPanelToFrame() { Container contentPane = frame.getContentPane(); contentPane.setLayout(new BorderLayout()); contentPane.add(panel, BorderLayout.CENTER); contentPane.add(TestDesktopPane.INSTANCE, BorderLayout.NORTH); } private void createMainPanel() { panel = new PopupPanel(); panel.setName("Main Panel"); FlowLayout flowLayout = new FlowLayout(); flowLayout.setAlignment(FlowLayout.CENTER); panel.setLayout(flowLayout); } private void addMenuBar() { frame.setJMenuBar(new TestMenuBar()); } @SuppressWarnings("serial") private void createFrame() { frame = new JFrame("Test App") { @Override public Dimension getPreferredSize() { return new Dimension(1000, 1000); } }; frame.setName("Main Frame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } @SuppressWarnings("serial") private void addComponentsToMainPanel() { panel.add(new TestTextField()); panel.add(new TestButton()); panel.add(new TestList()); panel.add(new TestList() { { setName("listWithRenderer"); setCellRenderer(new DefaultListCellRenderer() { @Override public String getText() { return super.getText().toUpperCase(); } }); } }); panel.add(new TestCheckBox("Test Checkbox")); panel.add(new TestCheckBox("Test Checkbox 2")); panel.add(new TestCheckBox("Test Checkbox 3")); panel.add(new TestCheckBox("Test Checkbox 4")); panel.add(new TestComboBox()); panel.add(new TestComboBox() { { setName("comboboxWithRenderer"); setRenderer(new DefaultListCellRenderer() { @Override public String getText() { return super.getText().toUpperCase(); } }); } }); final ContentChangingCombobox contentChangingComboBox = new ContentChangingCombobox(); panel.add(new JButton("Reset Content Changing Combobox") { { setName("resetContentChangingComboBox"); addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { contentChangingComboBox.resetModel(); } }); } }); panel.add(contentChangingComboBox); panel.add(new TestComboBox() { { setName("disabledComboBox"); setEnabled(false); } }); panel.add(new TestLabel()); JTextField tableEventTextField = new JTextField("tableEventTextField"); tableEventTextField.setName("tableEventTextField"); tableEventTextField.setText("tableEventTextField"); panel.add(new TestTable("testTable", getTestTableData(), tableEventTextField)); panel.add(new TestTable("TableWithSingleValue", getFoobarTestTableData(), tableEventTextField)); panel.add(new TestTree()); panel.add(new TreeWithoutTreeNode()); TestTextField tabButtonOutputTextField = new TestTextField(); tabButtonOutputTextField.setName("tabButtonOutputTextField"); panel.add(new TestTabbedPane("testTabbedPane1", tabButtonOutputTextField)); panel.add(new TestTabbedPane("testTabbedPane2", tabButtonOutputTextField)); panel.add(tabButtonOutputTextField); panel.add(new TestTextArea()); panel.add(new TestRadioButton()); panel.add(new TestToggleButton()); panel.add(new JButton("Open File Chooser") { { setName("openFileChooser"); addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { new TestFileChooser().showSaveDialog(panel); } }); } }); panel.add(new TestEditorPane()); panel.add(simpleTable()); panel.add(tableEventTextField); panel.add(new TextField() { { setName("awtTextField"); setPreferredSize(new Dimension(100, 30)); } }); panel.add(new TextField() { { setName("awtDisabledTextField"); setPreferredSize(new Dimension(100, 30)); setEnabled(false); } }); panel.add(new JTextField() { { setName("disabledTextField"); setEnabled(false); setPreferredSize(new Dimension(100, 30)); } }); panel.add(new JTextField() { { setName("uneditableTextField"); setEditable(false); setPreferredSize(new Dimension(100, 30)); } }); panel.add(new TestSpinnerButton("testSpinner")); List<String> weekDays = Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"); panel.add(new TestSpinnerButton("stringSpinner", new SpinnerListModel( weekDays))); panel.add(new TestSpinnerButton("floatSpinner", new SpinnerNumberModel( 77.7, 0.0, 1000.0, 0.1))); panel.add(testSlider()); panel.add(tableWithHeader()); panel.add(new TestScrollPane()); panel.add(new TestFastUpdatingPane()); } private Component tableWithHeader() { JTable tableWithHeader = new JTable(1, 2); tableWithHeader.setName("tableWithHeader"); JTableHeader tableHeader = tableWithHeader.getTableHeader(); tableHeader.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent evt) { JTable table = ((JTableHeader) evt.getSource()).getTable(); TableColumnModel colModel = table.getColumnModel(); int index = colModel.getColumnIndexAtX(evt.getX()); table.setValueAt("Col header " + index, 0, 0); } }); Box box = Box.createVerticalBox(); box.add(tableHeader); box.add(tableWithHeader); return box; } private JSlider testSlider() { JSlider slider = new JSlider(0, 5); slider.setName("testSlider"); slider.setMajorTickSpacing(1); slider.setPaintTicks(true); return slider; } private Object[][] getTestTableData() { return new Object[][]{ {"column one", "one/one", "two/one", "three/one", "four/one"}, {"column two", "one/two", "two/two", "three/two", "four/two"}, {"column three", "one/three", "two/three", "three/three", "four/three!!!"}, {"column four", Boolean.TRUE, Boolean.TRUE, Boolean.FALSE, Boolean.FALSE}}; } private Object[][] getFoobarTestTableData() { return new Object[][] { { "column one", "foo", "bar", "bar", "bar 1" }, { "column two", "bar", "foo", "bar", "bar 2" }, { "column three", "bar", "bar", "foo", "bar 3" }, { "column four", "bar", "bar", "bar", "foo 4" } }; } private JTable simpleTable() { String[] colNames = { "first col", "second col" }; Object[][] data = { { "fooness", "barness" }, { "quuxness", "lochness" }, }; @SuppressWarnings("serial") JTable table = new JTable(data, colNames) { @Override public boolean isCellEditable(int row, int column) { return column != 1; } }; table.setName("simpleTable"); table.setCellSelectionEnabled(true); return table; } } @SuppressWarnings("serial") class ContentChangingCombobox extends JComboBox implements ActionListener { private static final String REMOVABLE_ITEM = "Removable"; private static final String[] ITEMS = new String[] { "Foo", "Bar", "Quux", REMOVABLE_ITEM }; public ContentChangingCombobox() { setEditable(true); setName("contentChangingCombobox"); addActionListener(this); setModel(new DefaultComboBoxModel(ITEMS)); } @Override public void actionPerformed(ActionEvent event) { if (event.getActionCommand().equals("comboBoxChanged")) { String selected = (String) getSelectedItem(); List<String> items = new ArrayList<String>(); if (!selected.equals(REMOVABLE_ITEM)) items.add(selected); ComboBoxModel model = getModel(); for (int i = 0, size = model.getSize(); i < size; i++) { String item = (String) model.getElementAt(i); if (!item.equals(selected)) items.add(item); } setModel(new DefaultComboBoxModel(items.toArray())); setSelectedIndex(0); } } public void resetModel() { setModel(new DefaultComboBoxModel(ITEMS)); } } @SuppressWarnings("serial") class PopupPanel extends JPanel { private final Operation showName = new Operation() { public void perform(Component operatedComponent) { JOptionPane.showMessageDialog(operatedComponent, operatedComponent.getName()); } }; private final ContextMenu popup = new ContextMenu() { { add("Show name", showName); } }; @Override public Component add(Component comp) { addPopupToComponentIfRequired(comp); return super.add(comp); } private void addPopupToComponentIfRequired(Component comp) { if (isWithPopup(comp)) { addPopupToComponent(comp); } } private boolean isWithPopup(Component comp) { return comp.getClass().isAnnotationPresent(WithPopup.class); } private void addPopupToComponent(Component comp) { comp.addMouseListener(new MouseAdapter() { @Override public void mouseReleased(MouseEvent e) { if (e.getButton() == MouseEvent.BUTTON3) { popup.show((Component) e.getSource(), e.getX(), e.getY()); } } }); } } @SuppressWarnings("serial") class CustomComboBoxRenderer extends JLabel implements ListCellRenderer { private Font uhOhFont; public CustomComboBoxRenderer() { setOpaque(true); setHorizontalAlignment(CENTER); setVerticalAlignment(CENTER); } public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { if (isSelected) { setBackground(list.getSelectionBackground()); setForeground(list.getSelectionForeground()); } else { setBackground(list.getBackground()); setForeground(list.getForeground()); } String pet = "Pet" + index; setUhOhText(pet + " (no image)", list.getFont()); return this; } protected void setUhOhText(String uhOhText, Font normalFont) { if (uhOhFont == null) uhOhFont = normalFont.deriveFont(Font.ITALIC); setFont(uhOhFont); setText(uhOhText); } }